package pers.xiaojun.boot.excel.util;

import cn.idev.excel.FastExcelFactory;
import cn.idev.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import jakarta.servlet.http.HttpServletResponse;
import pers.xiaojun.boot.excel.constants.ExcelConstants;
import pers.xiaojun.boot.excel.handler.DefaultCellStyleStrategy;

import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * Excel工具类
 *
 * @author xiaojun
 * @since 2025-11-07
 */
public class ExcelUtils {

    /**
     * 转 Excel 写入到 response 中
     *
     * @param response  响应体
     * @param filename  文件名称
     * @param sheetName sheet名称
     * @param head      映射实体类（目标类）
     * @param data      数据
     * @param <T>       数据类型
     * @throws IOException IO异常
     */
    public static <T> void write(HttpServletResponse response, String filename, String sheetName, Class<T> head, List<T> data) throws IOException {
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8));
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");

        FastExcelFactory.write(response.getOutputStream(), head)
                .autoCloseStream(false)
                .registerWriteHandler(new DefaultCellStyleStrategy())
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .sheet(sheetName)
                .doWrite(data);
    }

    /**
     * 将Excel输入流转Java对象列表
     *
     * @param inputStream 输入流（Excel文件）
     * @param head        映射实体类
     * @param <T>         目标类型
     * @return 数据列表
     */
    public static <T> List<T> read(InputStream inputStream, Class<T> head) {
        return FastExcelFactory.read(inputStream, head, null)
                .autoCloseStream(false)
                .doReadAllSync();
    }

    /**
     * 给文件名添加 .xlsx 后缀
     *
     * @param filename 文件名
     * @return 文件名
     */
    public static String toXlsxFilename(String filename) {
        return filename + ExcelConstants.XLSX_SUFFIX;
    }

    /**
     * 给文件名添加 .xls 后缀
     *
     * @param filename 文件名
     * @return 文件名
     */
    public static String toXlsFilename(String filename) {
        return filename + ExcelConstants.XLS_SUFFIX;
    }

}
